<?php

namespace common\components;

use yii\base\Object;
use yii\web\UploadedFile;
use common\components\MTools;

class Upload extends Object {

    protected $arr_type = ["image/jpeg", "image/pjpeg", "image/png", "image/x-png", "image/gif"]; //上传图片类型
    protected $size = 20000000; //图片上传尺寸设定
    public $oldname = false; //是否使用原文件名称

    /**
     * [UploadPhoto description]
     * @param [type]  $model      [实例化模型]
     * @param [type]  $path       [图片存储路径]
     * @param [type]  $originName [图片源名称]
     * @param boolean $isthumb    [是否要缩略图 或 压缩] 【1 缩略  2压缩
     * @param [int]   $toW        [缩略宽度]
     * @param [int]   $toH        [缩略高度]
     */

    public function UploadPhoto($model, $originName, $isthumb = false, $toW = null, $toH = null) {
        //是否多图片上传
        if(strpos($originName, "[]") === FALSE){
            //返回一个实例化对象
            $files = UploadedFile::getInstances($model, $originName);
            if ($files && $this->checkType($files[0]) && $this->checkSize($files[0]->size)) {
                $filename = $this->getFilename($files[0]);
            } else {
                return false;
            }
            //保存图片
            if ($files[0]->saveAs($filename, true)) {
                if ($isthumb) {
                    //生成缩略图
                    $this->createThumb($filename, $isthumb, $toW, $toH);
                }
            }
            return $filename;
        }else{
            //返回一个实例化对象
            $files = UploadedFile::getInstancesByName($originName);
            $filename_arr = [];
            foreach($files as $file){
                if($file && $this->checkType($file) && $this->checkSize($file->size)){
                    $filename = $this->getFilename($file);
                    //保存图片
                    if ($file->saveAs($filename, true)) {
                        array_push($filename_arr,$filename);
                        if ($isthumb) {
                            //生成缩略图
                            $this->createThumb($filename, $isthumb, $toW, $toH);
                        }
                    }
                }
            }
            return $filename_arr;
        }
    }

    /*
     * 判断图片上传类型是否正确
     * params $files object
     * return boolean
     */

    protected function checkType($files) {
        return ($files && in_array($files->type, $this->arr_type)) ? true : false;
    }

    /*
     * 判断图片上传尺寸是否符合要求
     * params $size
     * return boolean
     */

    protected function checkSize($size) {
        return $size > $this->size ? false : true;
    }

    /*
     * 获取文件上传路径
     * params $files object
     * return string
     */

    protected function getFilename($files) {
        return MTools::getfilePath($files->extension, $this->oldname, $files->name);
    }

    /*
     * 生成缩略图
     * @params $isthumb 1缩略 或 2压缩  
     * @params $filename string 上传原图文件名称路径
     * @params $toW    缩略宽度
     * @params $toH    缩略高度
     * return boolean
     */

    protected function createThumb($filename, $isthumb, $toW, $toH) {
        //判断缩略图 压缩
        if ($isthumb == 1) {
            list($ofile, $ext) = explode(".", $filename);
            $toFile = $ofile . '.thumb' . $ext;
        } else {
            $toFile = $filename;
        }
        $data = getimagesize($filename); //返回含有4个单元的数组，0-宽，1-高，2-图像类型，3-宽高的文本描述。 
        if (!$data) {
            return false;
        }
        //将文件载入到资源变量im中
        switch ($data[2]) { //1-GIF，2-JPG，3-PNG
            case 1:
                if (!function_exists("imagecreatefromgif")) {
                    return false;
                }
                $im = imagecreatefromgif($filename);
                break;
            case 2:
                if (!function_exists("imagecreatefromjpeg")) {
                    return false;
                }
                $im = imagecreatefromjpeg($filename);
                break;
            case 3:
                if (!function_exists("imagecreatefrompng")) {
                    return false;
                }
                $im = imagecreatefrompng($filename);
                break;
        }
        //计算缩略图的宽高
        $srcW = imagesx($im);
        $srcH = imagesy($im);
        if ($isthumb == 1) {
            $toWH = $toW / $toH;
            $srcWH = $srcW / $srcH;
            if ($toWH <= $srcWH) {
                $ftoW = $toW;
                $ftoH = (int) ($ftoW * ($srcH / $srcW));
            } else {
                $ftoH = $toH;
                $ftoW = (int) ($ftoH * ($srcW / $srcH));
            }
        } else {
            $ftoW = $toW;
            $ftoH = $toH;
        }

        if (function_exists("imagecreatetruecolor")) {
            $ni = imagecreatetruecolor($ftoW, $ftoH); //新建一个真彩色图像
            if ($ni) {
                //重采样拷贝部分图像并调整大小 可保持较好的清晰度
                imagecopyresampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
            } else {
                //拷贝部分图像并调整大小
                $ni = imagecreate($ftoW, $ftoH);
                imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
            }
        } else {
            $ni = imagecreate($ftoW, $ftoH);
            imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);
        }

        switch ($data[2]) { //1-GIF，2-JPG，3-PNG
            case 1:
                imagegif($ni, $toFile);
                break;
            case 2:
                imagejpeg($ni, $toFile);
                break;
            case 3:
                imagepng($ni, $toFile);
                break;
        }
        ImageDestroy($ni);
        ImageDestroy($im);
        return $toFile;
    }

}